package com.qunar.train.mock.util;

import java.io.File;
import java.util.List;

/**
 * @author: xudong.tai
 * @since: 2018/7/5 Description:
 **/
public class FileAndDirSearch {
    /**
     * 递归查找文件
     *
     * @param baseDirName    查找的文件夹路径
     * @param targetFileName 需要查找的文件名
     * @param fileList       查找到的文件集合
     */
    public static void findFiles(String baseDirName, String targetFileName, List fileList) {

        File baseDir = new File(baseDirName);        // 创建一个File对象
        if (!baseDir.exists() || !baseDir.isDirectory()) {    // 判断目录是否存在
            AegisLog.info("文件查找失败：" + baseDirName + "不是一个目录！");
        }
        String tempName = null;
        File tempFile;
        File[] files = baseDir.listFiles();
        if (files == null) {
            return;
        }
        for (int i = 0; i < files.length; i++) {
            tempFile = files[i];
            if (tempFile.isDirectory()) {
                findFiles(tempFile.getAbsolutePath(), targetFileName, fileList);
            } else if (tempFile.isFile()) {
                tempName = tempFile.getName();
                if (wildcardMatch(targetFileName, tempName)) {
                    // 匹配成功，将文件名添加到结果集
                    fileList.add(tempFile.getAbsoluteFile());
                }
            }
        }
    }

    /**
     * 递归查找文件
     *
     * @param baseDirName    查找的文件夹路径
     * @param excludeDirName 排除的文件夹路径
     * @param targetFileName 需要查找的文件名
     * @param fileList       查找到的文件集合
     */
    public static void findFiles(String baseDirName, String excludeDirName, String targetFileName, List fileList) {

        File baseDir = new File(baseDirName);        // 创建一个File对象
        if (!baseDir.exists() || !baseDir.isDirectory()) {    // 判断目录是否存在
            AegisLog.info("文件查找失败：" + baseDirName + "不是一个目录！");
        }
        String tempName = null;
        File tempFile;
        File[] files = baseDir.listFiles();
        if (files == null) {
            return;
        }
        for (int i = 0; i < files.length; i++) {
            tempFile = files[i];
            if (tempFile.isDirectory()) {
                if (tempFile.getName().compareTo(excludeDirName) == 0) {
                    continue;
                }
                findFiles(tempFile.getAbsolutePath(), excludeDirName, targetFileName, fileList);
            } else if (tempFile.isFile()) {
                tempName = tempFile.getName();
                if (wildcardMatch(targetFileName, tempName)) {
                    // 匹配成功，将文件名添加到结果集
                    fileList.add(tempFile.getAbsoluteFile());
                }
            }
        }
    }

    /**
     * 递归查找目录
     *
     * @param baseDirName   查找的文件夹路径
     * @param targetDirName 需要查找的目录名
     * @param dirList       查找到的目录集合
     */
    public static void findDirs(String baseDirName, String targetDirName, List dirList) {

        File baseDir = new File(baseDirName);        // 创建一个File对象
        if (!baseDir.exists() || !baseDir.isDirectory()) {    // 判断目录是否存在
            AegisLog.info("文件查找失败：" + baseDirName + "不是一个目录！");
        }
        String tempName = null;
        File tempDir;
        File[] files = baseDir.listFiles();
        if (files == null) {
            return;
        }
        for (int i = 0; i < files.length; i++) {
            tempDir = files[i];
            if (tempDir.isDirectory()) {
                tempName = tempDir.getName();
                if (wildcardMatch(targetDirName, tempName)) {
                    // 匹配成功，将目录名添加到结果集
                    dirList.add(tempDir.getAbsoluteFile());
                }
                findDirs(tempDir.getAbsolutePath(), targetDirName, dirList);
            } else if (tempDir.isFile()) {
                continue;
            }
        }
    }

    /**
     * 通配符匹配
     *
     * @param pattern 通配符模式
     * @param str     待匹配的字符串
     * @return 匹配成功则返回true，否则返回false
     */
    private static boolean wildcardMatch(String pattern, String str) {
        int patternLength = pattern.length();
        int strLength = str.length();
        int strIndex = 0;
        char ch;
        for (int patternIndex = 0; patternIndex < patternLength; patternIndex++) {
            ch = pattern.charAt(patternIndex);
            if (ch == '*') {
                //通配符星号*表示可以匹配任意多个字符
                while (strIndex < strLength) {
                    if (wildcardMatch(pattern.substring(patternIndex + 1),
                            str.substring(strIndex))) {
                        return true;
                    }
                    strIndex++;
                }
            } else if (ch == '?') {
                //通配符问号?表示匹配任意一个字符
                strIndex++;
                if (strIndex > strLength) {
                    //表示str中已经没有字符匹配?了。
                    return false;
                }
            } else {
                if ((strIndex >= strLength) || (ch != str.charAt(strIndex))) {
                    return false;
                }
                strIndex++;
            }
        }
        return (strIndex == strLength);
    }

}
